/*
 * Copyright 2020 Tier IV, Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <string>
#include <unordered_map>
#include <utility>
#include <vector>

#include <fmt/format.h>
#include <ros/console.h>
#include <ros/time.h>

inline void logThrottleNamed(
  const ros::console::levels::Level & log_level, const double duration,
  const std::string & log_name, const std::string & msg)
{
  static std::unordered_map<std::string, ros::Time> last_output_time;

  if (last_output_time.count(log_name) != 0) {
    const auto time_from_last_output = ros::Time::now() - last_output_time.at(log_name);
    if (time_from_last_output.toSec() < duration) {
      return;
    }
  }

  last_output_time[log_name] = ros::Time::now();
  ROS_LOG_STREAM(log_level, ROSCONSOLE_DEFAULT_NAME, msg);
}
